/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Dao;

import Model.CidadeModel;
import Model.ClienteModel;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Diego
 */
public class ClienteDao {

    public static final int cNavPrimeiro = 0;
    public static final int cNavAnterior = 1;
    public static final int cNavProximo = 2;
    public static final int cNavUltimo = 3;

    public static void Salvar(ClienteModel cliente) {
        Connection conexao = FabricaConexao.GeraConexao();
        PreparedStatement insereSt = null;

        String sql = "insert into cliente (COD_CLI, NOME_CLI, CPF_CLI, LOGRADOURO_CLI, BAIRRO_CLI, NUMERO_CLI, CIDADE_CLI)"
                + "values(?,?,?,?,?,?,?);";
        try {
            insereSt = conexao.prepareStatement(sql);
            insereSt.setInt(1, cliente.getCodCliente());
            insereSt.setString(2, cliente.getNomeCliente());
            insereSt.setString(3, cliente.getCpfCliente());
            insereSt.setString(4, cliente.getLogradouroCliente());
            insereSt.setString(5, cliente.getBairroCliente());
            insereSt.setInt(6, cliente.getNumeroCliente());
            insereSt.setInt(7, cliente.getCidadeCliente().getCodCidade());
            insereSt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(ClienteDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                insereSt.close();
                conexao.close();
            } catch (SQLException ex) {
                Logger.getLogger(ClienteDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

    }

    public static void Alterar(ClienteModel cliente) {

        Connection conexao = FabricaConexao.GeraConexao();
        PreparedStatement insereSt = null;
        String sql = "update cliente set COD_CLI=?, NOME_CLI=?, CPF_CLI=?, LOGRADOURO_CLI=?, BAIRRO_CLI=?, NUMERO_CLI=?, CIDADE_CLI=? where COD_CLI=" + cliente.getCodCliente();

        try {
            insereSt = conexao.prepareStatement(sql);
            insereSt.setInt(1, cliente.getCodCliente());
            insereSt.setString(2, cliente.getNomeCliente());
            insereSt.setString(3, cliente.getCpfCliente());
            insereSt.setString(4, cliente.getLogradouroCliente());
            insereSt.setString(5, cliente.getBairroCliente());
            insereSt.setInt(6, cliente.getNumeroCliente());
            insereSt.setInt(7, cliente.getCidadeCliente().getCodCidade());
            insereSt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(ClienteDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                insereSt.close();
                conexao.close();
            } catch (SQLException ex) {
                Logger.getLogger(ClienteDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

    }

    public static ClienteModel RecuperarCliente(int Cod) {

        Connection conexao = FabricaConexao.GeraConexao();
        ClienteModel clienteRecuperado = new ClienteModel();
        Statement consulta = null;
        ResultSet resultado = null;

        String sql = "select * from cliente where COD_CLI=" + Cod;
        try {
            consulta = (Statement) conexao.createStatement();
            resultado = consulta.executeQuery(sql);
            resultado.next();

            clienteRecuperado.setCodCliente(resultado.getInt("COD_CLI"));
            clienteRecuperado.setNomeCliente(resultado.getString("NOME_CLI"));
            clienteRecuperado.setCpfCliente(resultado.getString("CPF_CLI"));
            clienteRecuperado.setLogradouroCliente(resultado.getString("LOGRADOURO_CLI"));
            clienteRecuperado.setBairroCliente(resultado.getString("BAIRRO_CLI"));
            clienteRecuperado.setNumeroCliente(resultado.getInt("NUMERO_CLI"));
            clienteRecuperado.setCidadeCliente(CidadeDao.RecuperarCidade(resultado.getInt("CIDADE_CLI")));

        } catch (SQLException ex) {
            Logger.getLogger(ClienteDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                resultado.close();
                conexao.close();
                consulta.close();
            } catch (SQLException ex) {
                Logger.getLogger(ClienteDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

        return clienteRecuperado;
    }

    public static List<ClienteModel> RecuperaClientes(String sql) {
        Connection conexao = FabricaConexao.GeraConexao();
        List<ClienteModel> cli = new ArrayList<ClienteModel>();
        try {
            Statement objSTM = conexao.createStatement();
            objSTM.executeQuery(sql);
            ResultSet objResultSet = objSTM.getResultSet();
            while (objResultSet.next()) {
                ClienteModel x = new ClienteModel();
                String vID = objResultSet.getString("COD_CLI");
                String vNome = objResultSet.getString("NOME_CLI");
                String Cpf = objResultSet.getString("CPF_CLI");
                String Log = objResultSet.getString("LOGRADOURO_CLI");
                String bairro = objResultSet.getString("BAIRRO_CLI");
                String Num = objResultSet.getString("NUMERO_CLI");
                String Cid = objResultSet.getString("CIDADE_CLI");
                
                x.setCodCliente(Integer.parseInt(vID));
                x.setNomeCliente(vNome);
                x.setCpfCliente(Cpf);
                x.setLogradouroCliente(Log);
                x.setBairroCliente(bairro);
                x.setNumeroCliente(Integer.parseInt(Num));
                x.setCidadeCliente(CidadeDao.RecuperarCidade(Integer.parseInt(Cid)));
                cli.add(x);
            }
            objResultSet.close();
            objSTM.close();
        } catch (Exception erro) {
            String errorMsg = "Erro ao Recuperar: " + erro.getMessage();
            JOptionPane.showMessageDialog(null, errorMsg, "Mensagem", JOptionPane.ERROR_MESSAGE);
        }
        return cli;
    }
    public static int PegaCodPelaNavegacao (int iopcao, int iCodAtual){
        
        Connection conexao= FabricaConexao.GeraConexao();
        Statement consulta = null;
        ResultSet resultado = null;
        int CodEncontrado = -1;
        try {
            consulta = (Statement) conexao.createStatement();
            resultado = consulta.executeQuery(ClienteDao.SQLNavegacao( iopcao, iCodAtual));
            resultado.next();
            CodEncontrado= resultado.getInt("COD");
        } catch (SQLException ex) {
            Logger.getLogger(FabricaConexao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                resultado.close();
                conexao.close();
                consulta.close();
            } catch (SQLException ex) {
                Logger.getLogger(FabricaConexao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
        return CodEncontrado;      
        
        
    }


    public static String SQLNavegacao(int iopcao, int iCodAtual) {
        String sql = "";
        switch (iopcao) {
            case cNavPrimeiro:
                sql = " select min(COD_CLI) as COD from cliente ";
                break;
            case cNavAnterior:
                sql = " select max(COD_CLI) as COD from cliente where COD_CLI <" + String.valueOf(iCodAtual) + " ";
                break;
            case cNavProximo:
                sql = " select min(COD_CLI) as COD from cliente where COD_CLI >" + String.valueOf(iCodAtual) + " ";
                break;
            case cNavUltimo:
                sql = " select max(COD_CLI) as COD from cliente ";
                break;
        }
        return sql;
    }

    public static void Excluir(int CodAtual) {
        FabricaConexao.Excluir(CodAtual, "cliente", "COD_CLI");
    }

    public static ArrayList<ClienteModel> PesquisaObjeto(String NomeCampo, String Valor, boolean EmQualquerParte) {
        String sql = "select * from cliente where " + NomeCampo + " like '";
        if(EmQualquerParte){
            sql=sql + "%";
        }
        sql = sql + Valor + "%'";
        
        return (ArrayList<ClienteModel>) (List<ClienteModel>) RecuperaClientes(sql);
    }

     
    
}
